package cn.hyy.hrm.service.impl;

import cn.hyy.basic.util.PageList;
import cn.hyy.hrm.controller.vo.TenantVo;
import cn.hyy.hrm.Employee;
import cn.hyy.hrm.Tenant;
import cn.hyy.hrm.TenantMeal;
import cn.hyy.hrm.mapper.EmployeeMapper;
import cn.hyy.hrm.mapper.TenantMapper;
import cn.hyy.hrm.mapper.TenantMealMapper;
import cn.hyy.hrm.query.TenantQuery;
import cn.hyy.hrm.service.ITenantService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author hyy
 * @since 2020-04-02
 */
@Service
public class TenantServiceImpl extends ServiceImpl<TenantMapper, Tenant> implements ITenantService {

    @Autowired
    private EmployeeMapper employeeMapper;

    @Autowired
    private TenantMealMapper tenantMealMapper;

    /**
     * 高级查询+分页：
     *     传统方式：
     *          两条sql
     *          (1)count(*) 查询总条目数
     *          (2)limit 查询当前页的数据
     *          (3)封装pageList返回
     *     mybatis分页插件的方式：
     *          mapper接口将page作为第一个参数，则自动分页
     *          IPage<User> selectPageVo(Page<?> page, Integer state);
     * @param query
     * @return
     */
    @Override
    public PageList<Tenant> queryPage(TenantQuery query) {
        System.out.println(111);

        //mapper只写高级查询，分页交给分页插件
        IPage<Tenant> page = baseMapper.selectByQuery(new Page<>(query.getPage(), query.getRows()), query);
        PageList<Tenant> list = new PageList<>(page.getTotal(), page.getRecords());
        return list;

    }


    /**
     * 公司入驻
     * 思考：公司入驻的业务流程是什么样子的？要操作哪些表？先后顺序？
     *
     * t_tenant 租户表
     *
     * t_employee 存储租户的管理员账号信息
     *
     * t_tenant_meal 租户套餐表
     *
     * mybatis操作表不能级联操作，只能一张表一张表的操作
     *
     * @param tenantVo
     */
    @Override
    @Transactional //同一个事物，要么全部成功，要么全部失败
    public void register(TenantVo tenantVo) {

        //向租户表中插入数据  返回租户id
        Tenant tenant = new Tenant();
        BeanUtils.copyProperties(tenantVo,tenant);
        //初始化租户数据
        tenant.setRegisterTime(System.currentTimeMillis());
        tenant.setState(0);
        baseMapper.insert(tenant);//mybatisplus默认会返回新增数据的主键

        //向员工表中插入数据 - 租户管理员的用户和密码 - 返回员工id
        Employee employee = new Employee();
        BeanUtils.copyProperties(tenantVo,employee);
        //设置这个员工的租户id
        employee.setTenantId(tenant.getId());
        employeeMapper.insert(employee);


        //设置租户表中管理员的ID
        //为了防止修改的时候数据丢失，我们先查询出来，在更改
        tenant = baseMapper.selectById(tenant.getId());
        tenant.setAdminId(employee.getId());
        baseMapper.updateById(tenant);



        //最后修改租户-套餐中间表
        TenantMeal tenantMeal = new TenantMeal();
        tenantMeal.setTenantId(tenant.getId());
        tenantMeal.setMealId(tenantVo.getMeal());
        //计算一年之后
        long time = DateUtils.addYears(new Date(), 1).getTime();
        tenantMeal.setExpireDate(time);//失效日期
        tenantMealMapper.insert(tenantMeal);


    }
}
